"""
    阈值处理是最简单有效的图像分割方法，将灰度值与指定阈值（或自适应计算的阈值）进行比较
    通过大于阈值 和 小于等于阈值，从而将像素值分为两类
    在灰度图的基础上再次简化图像信息，突出我们感兴趣的部分
面试问答：
为什么要进行二值化？
二值化有哪些方法？
用什么函数进行二值化？
"""

import cv2
import numpy as np

img = cv2.imread('../images/flower.png')
h, w, _ = img.shape
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 自己写算法实现
img_binary = np.zeros_like(img_gray)
# 指定阈值和maxval
thresh = 127
maxval = 255
# 循环遍历图片，将每一个像素点与阈值进行比较
for i in range(h):
    for j in range(w):
        # 方法一: 二值化阈值处理，像素点灰度值大于阈值设为maxval，小于等于阈值设为0
        if img_gray[i, j] > thresh:
            img_binary[i, j] = maxval
        else:
            img_binary[i, j] = 0
        # # 方法二: 反二值化阈值处理。像素灰度值大于阈值时设为 0，小于等于阈值时设为 maxval。
        # if img_gray[i, j] <= thresh:
        #     img_binary[i, j] = maxval
        # else:
        #     img_binary[i, j] = 0
        # # 方法三: 截断阈值处理。像素灰度值大于阈值时设为阈值，小于等于阈值时保持不变。
        # if img_gray[i, j] > thresh:
        #     img_binary[i, j] = thresh
        # # 方法四: 低于阈值归零处理。像素灰度值大于阈值时保持不变，小于等于阈值时设为 0。
        # if img_gray[i, j] <= thresh:
        #     img_binary[i, j] = 0
        # # 方法五: 高于阈值归零处理。像素灰度值大于阈值时设为 0，小于等于阈值时保持不变。
        # if img_gray[i, j] > thresh:
        #     img_binary[i, j] = 0
# 显示图像
cv2.imshow('img', img)
cv2.imshow('img_gray', img_gray)
cv2.imshow('img_binary', img_binary)
cv2.waitKey(0)